home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / userbox / publicdomain / vmm / doc / deutsch / vmprogguideline < prev    next >
Text File  |  1996-07-24  |  4KB  |  90 lines

  1.                              $Date: 96/07/24 20:29:28 $
  2.  
  3. Falls  Sie Programme schreiben, die viel Speicher benötigen (z.B.  Ray
  4. Tracer,      Compiler,...),     helfen     Ihnen     die     folgenden
  5. Programmierrichtlinien dabei von virtuellem Speicher zu profitieren:
  6.  
  7. *********************************************************************
  8.  
  9. Greifen  Sie innerhalb eines Forbid/Permit bzw.  Disable/Enable-Paares
  10. nicht auf virtuellen Speicher zu.  Das folgende Beispiel zeigt, warum:
  11.  
  12. /* Dieses Beispielprogramm liest die Namen der gerade im Wartezustand
  13.  * befindlichen Tasks aus.
  14.  */
  15.  
  16. UBYTE *buffer;
  17. UBYTE *buffer_ptr;
  18. struct Task *tmpTask;
  19.  
  20. /* Dieser Puffer wird im virtuellen Speicher angelegt, wenn VMM läuft. */
  21. if ((buffer = AllocMem (SOME_SIZE, MEMF_ANY)) == NULL)      
  22.   return (FALSE);
  23.  
  24. buffer_ptr = buffer;
  25.  
  26. Forbid ();
  27. for (tmpTask = (struct Task*)SysBase->TaskWait.lh_Head;
  28.      tmpTask->tc_Node.ln_Succ != NULL;
  29.      tmpTask = tmpTask->tc_Node.ln_Succ)
  30.   {
  31.   strcpy (buffer_ptr, tmpTask->tc_Node.ln_Name);  /* dies kann einen Seitenfehler */
  32.                                                   /* verursachen. */
  33.   buffer_ptr += strlen (tmpTask->tc_Node.ln_Name) + 1);
  34.   }
  35. Permit ();
  36.  
  37. Dieses  Beispiel  kann  einen  Seitenfehler  produzieren,  während ein
  38. Taskname  in  den  internen  Puffer kopiert wird.  Da ein Seitenfehler
  39. eine  Taskumschaltung hervorruft, wird anschließend der ln_Next-Zeiger
  40. ungültig sein.  Dies kann einen Absturz hervorrufen.
  41.  
  42. *********************************************************************
  43.  
  44. Man  sollte  keine Messages, IORequests, Task-Struktures usw.  auf dem
  45. Stack  anlegen,  wenn man nicht absolut sicher ist, daß dieser sich in
  46. Public-Speicher befindet.
  47. Wenn  Sie  trotzdem  beispielsweise  einen  IORequest  auf  dem  Stack
  48. anlegen,  der  in  virtuellem  Speicher  sein  könnte,  und Sie diesen
  49. Request an das timer.device senden, kann der Rechner abstürzen, da das
  50. timer.device  auf den IORequest aus einem Interrupt zugreift.  Während
  51. sich  der  Prozessor  im  Supervisor-Modus befindet, sind Seitenfehler
  52. absolut tödlich.
  53.  
  54. *********************************************************************
  55.  
  56. Greifen  Sie  nicht  innerhalb  vom  Supervisor-Modus  auf  virtuellen
  57. Speicher zu.  Dies beinhaltet Interrupt- und Traphandler-Routinen.  Da
  58. die  Task,  die  den  Seitenfehler  verursacht,  in  den  Wartezustand
  59. versetzt  wird,  darf  ein  Seitenfehler nur von einer Task verursacht
  60. werden,   die   ihren   normalen   Stack   verwendet   und  nicht  den
  61. (systemglobalen) Supervisor-Stack.
  62.  
  63. *********************************************************************
  64.  
  65. Sie  sollten innerhalb eines Forbid/Permit bzw.  Disable/Enable-Paares
  66. weder  virtuellen  Speicher  allokieren  noch freigeben.  Allokationen
  67. innerhalb  solch  eines  Paares  erhalten  aus  Sicherheitsgründen nie
  68. virtuellen  Speicher,  das  Freigeben  wird  bis  nach  dem  Ende  des
  69. kritischen Abschnitts verschoben.
  70.  
  71. *********************************************************************
  72.  
  73. Speicher,  der ohne das MEMF_PUBLIC-Flag allokiert wurde, sollte nicht
  74. von anderen Tasks verwendet werden.  Z.B.  sollten Sie nicht aus einer
  75. Datei  lesen,  wenn  Sie  dafür  einen  Puffer  im virtuellen Speicher
  76. verwenden.
  77.  
  78. *********************************************************************
  79.  
  80. Legen Sie Daten, die meist zusammen gebraucht werden möglichst auch in
  81. benachbarte  Speicherbereiche.  Wenn Sie z.B.  ein Programm schreiben,
  82. das  aus  mehreren  Durchläufen  besteht, allokieren Sie die Daten für
  83. jeden  Durchlauf  zusammen.   Das  kann die Seitenfehlerrate drastisch
  84. reduzieren.
  85.  
  86. *********************************************************************
  87.  
  88. Zusätzlich   zu  den  obigen  Regeln  sollten  Sie  immer  Commodore's
  89. Programmierrichtlinien befolgen.
  90.